﻿using Application_Core.Arbeitsplan_Component.Access_Layer;
using Application_Core.Bauteil_Component.Access_Layer;
using Application_Core.Bauteil_Component.Data_Access_Layer;
using Application_Core.Bauteil_Component.Data_Access_Layer.Implementations;
using System;
using System.Collections.Generic;
using Utility.Global.Utilities;
using Utility.Persistence_Service;

namespace Application_Core.Bauteil_Component.Business_Logic_Layer
{
    internal class BauteilComponentBusinessLogicImpl : BauteilComponentBusinessLogic
    {
        private readonly BauteilRepository bauteilRepo;
        private readonly StücklisteRepository stücklisteRepo;
        private readonly StücklistenPositionRepository stücklistenPositionRepo;
        private readonly FertigungsauftragRepository fertigungsauftragRepo;
        private readonly UnitOfWork unitOfWork;
        private readonly ArbeitsplanInternalService arbeitsplanInternal;

        public BauteilComponentBusinessLogicImpl(UnitOfWork unitOfWork, ArbeitsplanInternalService arbeitsplanInternal)
        {
            this.unitOfWork = unitOfWork;
            this.arbeitsplanInternal = arbeitsplanInternal;
            this.bauteilRepo = new BauteilRepositoryImpl(unitOfWork);
            this.stücklisteRepo = new StücklisteRepositoryImpl(unitOfWork);
            this.stücklistenPositionRepo = new StücklistenPositionRepositoryImpl(unitOfWork);
            this.fertigungsauftragRepo = new FertigungsauftragRepositoryImpl(unitOfWork);
        }

        public TimeSpan FertigeBauteil(Bauteil bauteil)
        {
            TimeSpan fertigungszeit = new TimeSpan(0);

            if (!this.IstBauteilKomplex(bauteil))
            {
                return fertigungszeit;
            }

            Stückliste stückliste = this.stücklisteRepo.FindByBauteil(bauteil);
            List<StücklistenPosition> positionen = this.stücklistenPositionRepo.FindByStückliste(stückliste);
            foreach (StücklistenPosition position in positionen)
            {
                fertigungszeit += this.arbeitsplanInternal.BerechneFertigungszeit(bauteil.Id, position.Menge);
            }

            return fertigungszeit;
        }

        private bool IstBauteilKomplex(Bauteil bauteil)
        {
            Stückliste stückliste = this.stücklisteRepo.FindByBauteil(bauteil);
            bool hasArbeitsplan = this.arbeitsplanInternal.HasArbeitsplan(bauteil.Id);
            return (stückliste != null && hasArbeitsplan);
        }
    }
}
